﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Ecommerce.Model;
using Ecommerce.Pagamento.CartaoCredito;

namespace Ecommerce.Web.Code
{
    public class Carrinho
    {
        private const string idSessao = "carrinho";
        public List<tb_ipe_item_pedido> Items { get; private set; }
        public static readonly Carrinho Instance;
        public decimal Frete { get; set; }
        public int IdentificadorEndereco { get; set; }
        public tb_tra_transportadora Transportadora { get; set; }
        public EAutorizacao DadosCartaoCredito { get; set; }
        public string FormaPagamento { get; set; }
        public tb_cup_cupom Cupom { get; set; }

        public decimal SubTotal
        {
            get
            {
               return this.Items.Sum(x => x.ipe_qtd_item_pedido * x.ipe_vlr_item);
            }
        }

        public decimal PesoTotal
        {
            get
            {
                return this.Items.Sum(x => x.ipe_qtd_item_pedido * x.tb_pro_produto.pro_vlr_peso.Value);
            }
        }

        public decimal PesoTotalKg
        {
            get
            {
                decimal kg = 0.001M;
                return this.Items.Sum(x => x.ipe_qtd_item_pedido * x.tb_pro_produto.pro_vlr_peso.Value) * kg;
            }
        }

        public decimal Total
        {
            get
            {
                decimal desconto = 0;
                if (DescontoCupom > 0)
                {
                    desconto = SubTotal * DescontoCupom;
                }
                return (SubTotal + Frete) - desconto;
            }
        }

        public decimal DescontoCupom
        {
            get
            {
                if (Cupom != null)
                {
                    if (Cupom.cup_val_desconto > 0)
                    {
                        return (Cupom.cup_val_desconto * 0.01M);
                    }
                }

                return 0;
            }
        }

        protected Carrinho()
        {

        }

        static Carrinho()
        {
            if (HttpContext.Current.Session[idSessao] == null)
            {
                Instance = new Carrinho();
                Instance.Items = new List<tb_ipe_item_pedido>();
                HttpContext.Current.Session[idSessao] = Instance;
            }
            else
            {
                Instance = (Carrinho)HttpContext.Current.Session[idSessao];
            }
        }

        public void Adicionar(tb_pro_produto produto, int quantidade, decimal valorProduto)
        {
            tb_ipe_item_pedido itemExistente = this.Items.Where(x => x.pro_idt_produto == produto.pro_idt_produto).FirstOrDefault();
            if (itemExistente != null)
            {
                itemExistente.ipe_qtd_item_pedido = quantidade;
            }
            else
            {
                tb_ipe_item_pedido novoItem = new tb_ipe_item_pedido() { pro_idt_produto = produto.pro_idt_produto, ipe_qtd_item_pedido = quantidade, ipe_vlr_item = valorProduto, tb_pro_produto = produto };
                this.Items.Add(novoItem);
            }
        }

        public void Remover(int identificadorProduto)
        {
            tb_ipe_item_pedido itemExistente = this.Items.Where(x => x.pro_idt_produto == identificadorProduto).FirstOrDefault();
            if (itemExistente != null)
                this.Items.Remove(itemExistente);
        }

        public void Limpar()
        {
            Items.Clear();
            Frete = 0;
            IdentificadorEndereco = 0;
            Transportadora = null;
            DadosCartaoCredito = null;
            FormaPagamento = string.Empty;
            Cupom = null;

            HttpContext.Current.Session.Remove(idSessao);
            HttpContext.Current.Session[idSessao] = null;
        }
    }
}